package com.altran.web.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.PersistenceException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.altran.web.forms.FormularioVistaConsultor;
import com.altran.web.model.Concepto;
import com.altran.web.model.Dedicacion;
import com.altran.web.service.GestionDedicacionesServ;
import com.altran.web.service.GestionDedicacionesServImpl;
import com.altran.web.utilities.Utilities;

/**
 * Servlet implementation class GestionVistasConsultor
 */
public class GestionVistasConsultorServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		Date fechaInicio = new Date();
		Date fechaFinal = new Date();
		//Número de días a mostrar por defecto
		int numDias = 15;
		
		FormularioVistaConsultor form = null;
		
		//Mostramos la vista general del consultor
		if (request.getParameter("id_consultor") != null || request.getParameter("idConsultor") != null) {
			
			/*Creamos el formulario modelizado en una clase para validar sus datos*/
			form = new FormularioVistaConsultor(request);
			int id_consultor = (request.getParameter("id_consultor") != null) ? Integer.parseInt(request.getParameter("id_consultor")) : form.getIdConsultor();
			
			
			/*Nos han pulsado el botón de filtrado de fechas*/
			if (request.getParameter("buscar") != null) {
				
				/*Si no existen errores de validación en el formulario*/
				if (form.getMensajesError().size() == 0) {
					fechaInicio = form.getFechaInicialFilter();
					fechaFinal = form.getFechaFinalFilter();
					/*Inclusive fechaFinal : explicación + 1*/
					numDias = (int) Utilities.obtenerNumDiasEntreFechas(fechaInicio, fechaFinal) + 1;
				}	 
			}
			
			/*Nos han pulsado el botón de crear dedicacion*/
			if (request.getParameter("creardedicacion") != null) {
				
				/*Si no existen errores de validación en el formulario*/
				if (form.getMensajesError().size() == 0) {
					//CREAMOS LA DEDICACION ASOCIADA A UN CONCEPTO-CONSULTOR TODO
					try {
						GestionDedicacionesServ servicio = new GestionDedicacionesServImpl();
						/*
						 * Controlamos que el id_consultor y concepto introducidos son correctos. La comprobación es simple, solo miramos si existen en la
						 * BD. En un caso real deberíamos comprobar el usuario que hace la petición es quién dice ser.
						 * */
						servicio.crearDedicacion(id_consultor, form.getIdConcepto(), form.getFechaInicialDedicacion(),form.getFechaFinalDedicacion(), form.getPorcentajeOcupacion());
						
					} catch (PersistenceException exc) {
						form.getMensajesError().add("Error al crear la dedicación");
					}
				}
			}
			
			GestionDedicacionesServ servicio = new GestionDedicacionesServImpl();
			
			List<Concepto> conceptos = new ArrayList<>();
			List<Dedicacion> listaDedicaciones = new ArrayList<>();
			Map<String,Integer> mapaListaDedicacionesAcumuladas = new HashMap<String, Integer>();
			Map<Concepto,Map<String,Integer>> mapaConceptoDedicacionesAcumuladas = 
					new HashMap<Concepto, Map<String,Integer>>();
			
			/*Obtenemos los conceptos para un determina Consultor y en un determinado periodo*/
			conceptos = servicio.obtenerConceptoByConsultorByPeriod(id_consultor, fechaInicio, numDias);						
			
			/*Para cada concepto, obtenemos una lista de dedicaciones y creamos un Map<Concepto,Map<String,Integer>> para
			 *mapear los conceptos con las fechas y sus acumulados.  */
			for (Concepto concepto : conceptos) {
				listaDedicaciones = servicio.obtenerDedicacionesByConsultorByConceptoByPeriod(
						id_consultor, concepto.getId_concepto(), fechaInicio, numDias);
				mapaListaDedicacionesAcumuladas = servicio.mapearPeriodoByConsultor(listaDedicaciones, fechaInicio, numDias);
				mapaConceptoDedicacionesAcumuladas.put(concepto, mapaListaDedicacionesAcumuladas);
			}
			
			
			request.setAttribute("intervalofechas", Utilities.obtenerFechasEntreIntervalo(fechaInicio, numDias));
			request.setAttribute("mapaConceptoDedicacionesAcumuladas", mapaConceptoDedicacionesAcumuladas);
			
			/*Para poder mostrar todos los conceptos disponibles a la hora de crear una dedicación*/
			request.setAttribute("listaconceptos", servicio.obtenerTodosConceptos());
			
			request.setAttribute("idConsultor", id_consultor);
			request.setAttribute("nombreconsultor", servicio.buscarConsultorById(id_consultor));
			request.setAttribute("form", form);
			
			RequestDispatcher dispatcher = 
					request.getRequestDispatcher("calendarioconsultor.jsp");
			dispatcher.forward(request, response);
			
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}
